home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Visual Basic Source Code
/
Visual Basic Source Code.iso
/
vbsource
/
fscompr
/
compfile.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-12-23
|
6KB
|
279 lines
// CompFile.c: compresses a file
#include <stdio.h>
#include <io.h>
#include "zlib.h"
#define BUF_SIZE 1024
z_stream ZStream;
Bytef *BufIn, *BufOut;
int err;
FILE *fin, *fout;
long length;
/*******************************************************/
int LoadInput()
{
#if defined( _WINDOWS )
MSG msg;
while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}
#endif
if ( ZStream.avail_in == 0 ) {
ZStream.next_in = BufIn;
ZStream.avail_in = fread( BufIn, 1, BUF_SIZE, fin );
}
return ZStream.avail_in;
}
/*******************************************************/
int FlushOutput()
{
unsigned int count;
/*#if defined( _WINDOWS )*/
MSG msg;
while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}
/*#endif*/
count = BUF_SIZE - ZStream.avail_out;
if ( count ) {
if ( fwrite( BufOut, 1, count, fout ) != count ) {
err = Z_ERRNO;
return 0;
}
ZStream.next_out = BufOut;
ZStream.avail_out = BUF_SIZE;
}
return count;
}
/*******************************************************/
int PerCent()
/* returns an integer between 0 and 100 */
{
if ( length == 0 )
return 100;
else if ( length > 10000000L )
return ( ZStream.total_in / ( length / 100 ) );
else
return ( ZStream.total_in * 100 / length );
}
/*******************************************************/
int EXPORT CompFile (char *OutputName,
char *InputName,
int Level,
long (CALLBACK *lpPercCallback)( long Perc ) )
{
/* previous percent value: used to avoid calling two or more times
the callback function with the same percent value */
int OldPerc;
int NewPerc;
/* opens files */
fin = fopen( InputName, "rb" );
if( fin == NULL ) return -200;
fout = fopen( OutputName, "wb" );
if( fout == NULL ) return -201;
length = filelength( fileno( fin ) );
/* allocates buffers */
BufIn = (Bytef*) malloc( BUF_SIZE );
if( BufIn == NULL ) {
fclose( fin );
fclose( fout );
return Z_MEM_ERROR;
}
BufOut = (Bytef*) malloc( BUF_SIZE );
if( BufIn == NULL ) {
fclose( fin );
fclose( fout );
free( BufIn );
return Z_MEM_ERROR;
}
ZStream.zalloc = 0; //z_stream member
ZStream.zfree = 0; //z_stream member
ZStream.opaque = 0; //z_stream member
err = Z_OK;
ZStream.avail_in = 0;
ZStream.avail_out = BUF_SIZE;
ZStream.next_out = BufOut;
OldPerc = -1;
err = deflateInit(&ZStream, Level);
if (err != Z_OK) return err;
for ( ; ; ) {
/* if ( m_AbortFlag )
break;*/
if ( !LoadInput() )
break;
err = deflate( &ZStream, Z_NO_FLUSH );
FlushOutput();
if ( err != Z_OK )
break;
/*progress( percent() );*/
NewPerc = PerCent();
if( lpPercCallback != NULL && NewPerc != OldPerc ) {
(*lpPercCallback)( NewPerc );
OldPerc = NewPerc;
}
}
for ( ; ; ) {
/* if ( m_AbortFlag )
break;*/
err = deflate( &ZStream, Z_FINISH );
if ( !FlushOutput() )
break;
if ( err != Z_OK )
break;
}
/* progress( percent() );*/
NewPerc = PerCent();
if( lpPercCallback != NULL && NewPerc != OldPerc ) {
(*lpPercCallback)( NewPerc );
OldPerc = NewPerc;
}
deflateEnd( &ZStream );
/* if ( m_AbortFlag )
status( "User Abort" );
else if ( err != Z_OK && err != Z_STREAM_END )
status( "Zlib Error" );
else {
status( "Success" );
err = Z_OK;
}*/
if( err = Z_STREAM_END ) err = Z_OK;
fclose( fin );
fclose( fout );
free( BufIn );
free( BufOut );
return err;
}
/*******************************************************/
int EXPORT DecompFile (char *OutputName,
char *InputName,
long (CALLBACK *lpPercCallback)( long Perc ) )
{
/* previous percent value: used to avoid calling two or more times
the callback function with the same percent value */
int OldPerc;
int NewPerc;
/* opens files */
fin = fopen( InputName, "rb" );
if( fin == NULL ) return -200;
fout = fopen( OutputName, "wb" );
if( fout == NULL ) return -201;
length = filelength( fileno( fin ) );
/* allocates buffers */
BufIn = (Bytef*) malloc( BUF_SIZE );
if( BufIn == NULL ) {
fclose( fin );
fclose( fout );
return Z_MEM_ERROR;
}
BufOut = (Bytef*) malloc( BUF_SIZE );
if( BufIn == NULL ) {
fclose( fin );
fclose( fout );
free( BufIn );
return Z_MEM_ERROR;
}
ZStream.zalloc = 0; //z_stream member
ZStream.zfree = 0; //z_stream member
ZStream.opaque = 0; //z_stream member
err = Z_OK;
ZStream.avail_in = 0;
ZStream.avail_out = BUF_SIZE;
ZStream.next_out = BufOut;
OldPerc = -1;
err = inflateInit(&ZStream);
if (err != Z_OK) return err;
for ( ; ; ) {
/* if ( m_AbortFlag )
break;*/
if ( !LoadInput() )
break;
err = inflate( &ZStream, Z_NO_FLUSH );
FlushOutput();
if ( err != Z_OK )
break;
/*progress( percent() );*/
NewPerc = PerCent();
if( lpPercCallback != NULL && NewPerc != OldPerc ) {
(*lpPercCallback)( NewPerc );
OldPerc = NewPerc;
}
}
for ( ; ; ) {
/* if ( m_AbortFlag )
break;*/
err = inflate( &ZStream, Z_FINISH );
if ( !FlushOutput() )
break;
if ( err != Z_OK )
break;
}
/* progress( percent() );*/
NewPerc = PerCent();
if( lpPercCallback != NULL && NewPerc != OldPerc ) {
(*lpPercCallback)( NewPerc );
OldPerc = NewPerc;
}
inflateEnd( &ZStream );
/* if ( m_AbortFlag )
status( "User Abort" );
else if ( err != Z_OK && err != Z_STREAM_END )
status( "Zlib Error" );
else {
status( "Success" );
err = Z_OK;
}*/
if( err = Z_STREAM_END ) err = Z_OK;
fclose( fin );
fclose( fout );
free( BufIn );
free( BufOut );
return err;
}